function MM_timelineGoto(tmLnName, fNew, numGotos) { //v2.0

  //Copyright 1997 Macromedia, Inc. All rights reserved.

  var i,j,tmLn,props,keyFrm,sprite,numKeyFr,firstKeyFr,lastKeyFr,propNum,theObj;

  if (document.MM_Time == null) MM_initTimelines(); //if *very* 1st time

  tmLn = document.MM_Time[tmLnName];

  if (numGotos != null)

    if (tmLn.gotoCount == null) tmLn.gotoCount = 1;

    else if (tmLn.gotoCount++ >= numGotos) {tmLn.gotoCount=0; return}

  jmpFwd = (fNew > tmLn.curFrame);

  for (i = 0; i < tmLn.length; i++) {

    sprite = (jmpFwd)? tmLn[i] : tmLn[(tmLn.length-1)-i]; //count bkwds if jumping back

    if (sprite.charAt(0) == "s") {

      numKeyFr = sprite.keyFrames.length;

      firstKeyFr = sprite.keyFrames[0];

      lastKeyFr = sprite.keyFrames[numKeyFr - 1];

      if ((jmpFwd && fNew<firstKeyFr) || (!jmpFwd && lastKeyFr<fNew)) continue; //skip if untouchd

      for (keyFrm=1; keyFrm<numKeyFr && fNew>=sprite.keyFrames[keyFrm]; keyFrm++);

      for (j=0; j<sprite.values.length; j++) {

        props = sprite.values[j];

        if (numKeyFr == props.length) propNum = keyFrm-1 //keyframes only

        else propNum = Math.min(Math.max(0,fNew-firstKeyFr),props.length-1); //or keep in legal range

        if (sprite.obj != null) {

          if (props.prop2 == null) sprite.obj[props.prop] = props[propNum];

          else        sprite.obj[props.prop2][props.prop] = props[propNum];

      } }

    } else if (sprite.charAt(0)=='b' && fNew == sprite.frame) eval(sprite.value);

  }

  tmLn.curFrame = fNew;

  if (tmLn.ID == 0) eval('MM_timelinePlay(tmLnName)');

}

function MM_timelinePlay(tmLnName, myID) { //v1.2

  //Copyright 1997 Macromedia, Inc. All rights reserved.

  var i,j,tmLn,props,keyFrm,sprite,numKeyFr,firstKeyFr,propNum,theObj,firstTime=false;

  if (document.MM_Time == null) MM_initTimelines(); //if *very* 1st time

  tmLn = document.MM_Time[tmLnName];

  if (myID == null) { myID = ++tmLn.ID; firstTime=true;}//if new call, incr ID

  if (myID == tmLn.ID) { //if Im newest

    setTimeout('MM_timelinePlay("'+tmLnName+'",'+myID+')',tmLn.delay);

    fNew = ++tmLn.curFrame;

    for (i=0; i<tmLn.length; i++) {

      sprite = tmLn[i];

      if (sprite.charAt(0) == 's') {

        if (sprite.obj) {

          numKeyFr = sprite.keyFrames.length; firstKeyFr = sprite.keyFrames[0];

          if (fNew >= firstKeyFr && fNew <= sprite.keyFrames[numKeyFr-1]) {//in range

            keyFrm=1;

            for (j=0; j<sprite.values.length; j++) {

              props = sprite.values[j]; 

              if (numKeyFr != props.length) {

                if (props.prop2 == null) sprite.obj[props.prop] = props[fNew-firstKeyFr];

                else        sprite.obj[props.prop2][props.prop] = props[fNew-firstKeyFr];

              } else {

                while (keyFrm<numKeyFr && fNew>=sprite.keyFrames[keyFrm]) keyFrm++;

                if (firstTime || fNew==sprite.keyFrames[keyFrm-1]) {

                  if (props.prop2 == null) sprite.obj[props.prop] = props[keyFrm-1];

                  else        sprite.obj[props.prop2][props.prop] = props[keyFrm-1];

        } } } } }

      } else if (sprite.charAt(0)=='b' && fNew == sprite.frame) eval(sprite.value);

      if (fNew > tmLn.lastFrame) tmLn.ID = 0;

  } }

}

function MM_timelineStop(tmLnName) { //v1.2

  //Copyright 1997 Macromedia, Inc. All rights reserved.

  if (document.MM_Time == null) MM_initTimelines(); //if *very* 1st time

  if (tmLnName == null)  //stop all

    for (var i=0; i<document.MM_Time.length; i++) document.MM_Time[i].ID = null;

  else document.MM_Time[tmLnName].ID = null; //stop one

}

